package pe.com.ztaxi.taxis.model;

import java.beans.Transient;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table
public class Empresa {
	
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
	private Integer codEmpresa;
	
	@Column(nullable = false)
	private String ruc;
	
	@Column(nullable = false)
	private String razonSocial;
	
	@Column(nullable = false)
	private String tipoPago;
	
	@Column
	private String observacion;

	@JsonIgnore
	@OneToMany(mappedBy = "empresa")
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<EstadoCuentaEmpresa> estadoCuentas;
		
	@JsonIgnore
	@OneToMany(mappedBy = "empresa")
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<CentroCosto> centrosCosto;
	
	@JsonIgnore
	@OneToMany(mappedBy = "empresa")
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<Sede> sedes;
	
	@Column
	private Integer paramRadio;
	
	@Column
	private Integer paramRadioIncremental;
	
	@Column
	private Integer paramRadioMaximo;
	
	@Column
	private Integer paramMinutosPuntualidad;
	
	@Column
	private Integer paramMinutosMonitoreoOrden;
	
	@Column
	private Integer paramMinutosAlertaNoAsignacion;
	
	@Column
	private Integer paramMinutosAutoAsignacion;
	
	public List<EstadoCuentaEmpresa> getEstadoCuentas() {
		return estadoCuentas;
	}

	public void setEstadoCuentas(List<EstadoCuentaEmpresa> estadoCuentas) {
		this.estadoCuentas = estadoCuentas;
	}

	public Integer getCodEmpresa() {
		return codEmpresa;
	}

	public void setCodEmpresa(Integer codEmpresa) {
		this.codEmpresa = codEmpresa;
	}

	public String getRuc() {
		return ruc;
	}

	public void setRuc(String ruc) {
		this.ruc = ruc;
	}

	public String getRazonSocial() {
		return razonSocial;
	}

	public void setRazonSocial(String razonSocial) {
		this.razonSocial = razonSocial;
	}

	public String getTipoPago() {
		return tipoPago;
	}

	public void setTipoPago(String tipoPago) {
		this.tipoPago = tipoPago;
	}

	public String getObservacion() {
		return observacion;
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}		
	
	public List<CentroCosto> getCentrosCosto() {
		return centrosCosto;
	}

	public void setCentrosCosto(List<CentroCosto> centrosCosto) {
		this.centrosCosto = centrosCosto;
	}
	
	public List<Sede> getSedes() {
		return sedes;
	}

	public void setSedes(List<Sede> sedes) {
		this.sedes = sedes;
	}
	
	public Integer getParamRadio() {
		return paramRadio;
	}

	public void setParamRadio(Integer paramRadio) {
		this.paramRadio = paramRadio;
	}

	public Integer getParamRadioIncremental() {
		return paramRadioIncremental;
	}

	public void setParamRadioIncremental(Integer paramRadioIncremental) {
		this.paramRadioIncremental = paramRadioIncremental;
	}
	
	public Integer getParamRadioMaximo() {
		return paramRadioMaximo;
	}

	public void setParamRadioMaximo(Integer paramRadioMaximo) {
		this.paramRadioMaximo = paramRadioMaximo;
	}	
	
	public Integer getParamMinutosPuntualidad() {
		return paramMinutosPuntualidad;
	}

	public void setParamMinutosPuntualidad(Integer paramMinutosPuntualidad) {
		this.paramMinutosPuntualidad = paramMinutosPuntualidad;
	}

	public Integer getParamMinutosMonitoreoOrden() {
		return paramMinutosMonitoreoOrden;
	}	

	public void setParamMinutosMonitoreoOrden(Integer paramMinutosMonitoreoOrden) {
		this.paramMinutosMonitoreoOrden = paramMinutosMonitoreoOrden;
	}

	public Integer getParamMinutosAlertaNoAsignacion() {
		return paramMinutosAlertaNoAsignacion;
	}

	public void setParamMinutosAlertaNoAsignacion(
			Integer paramMinutosAlertaNoAsignacion) {
		this.paramMinutosAlertaNoAsignacion = paramMinutosAlertaNoAsignacion;
	}	
	
	public Integer getParamMinutosAutoAsignacion() {
		return paramMinutosAutoAsignacion;
	}

	public void setParamMinutosAutoAsignacion(Integer paramMinutosAutoAsignacion) {
		this.paramMinutosAutoAsignacion = paramMinutosAutoAsignacion;
	}

	@JsonIgnore
	@Transient
	public Double getTotalCredito(){
		Double total = 0.0;
		for(EstadoCuentaEmpresa e: estadoCuentas){
			total = total + e.getMontoServCredito();
		}
		return total;
	}
	
	@JsonIgnore
	@Transient
	public Double getTotalPagadoCredito(){
		Double total = 0.0;
		for(EstadoCuentaEmpresa e: estadoCuentas){
			total = total + e.getMontoPagado();
		}
		return total;
	}
	
	@JsonIgnore
	@Transient
	public Date getUltimaFechaCierre(){
		Date fecha = estadoCuentas.get(0).getFechaCierre();
		for(EstadoCuentaEmpresa e: estadoCuentas){
			if(e.getFechaCierre()!= null && fecha.after(e.getFechaCierre())){
				fecha = e.getFechaCierre();
			}
		}
		return fecha;
	}
	
}


	
